package com.bicon.botu.mall.component.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.bicon.botu.mall.component.common.LabelConstants;
import com.bicon.botu.mall.component.dto.LabelDTO;
import com.bicon.botu.mall.component.mapper.LabelMapper;
import com.bicon.botu.mall.component.service.ILabelService;
import com.bicon.botu.mall.component.entity.Label;
import com.bicon.botu.core.base.common.BusinessException;
import com.bicon.botu.core.base.common.Constants;
import com.bicon.botu.core.base.common.utils.IdGen;
import com.bicon.botu.core.base.common.utils.JsonUtil;
import com.bicon.botu.core.base.common.utils.StringUtils;
import com.bicon.botu.core.base.repository.redis.RedisHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * 标签库 服务层实现类
 *
 * @version 1.0.0
 * @author jingwj
 * @date create in 2017/12/25 9:53
 **/
@Service

public class LabelServiceImpl extends ServiceImpl<LabelMapper, Label> implements ILabelService {
    /**
     * redis操作类
     */
    @Autowired
    RedisHandler redisHandler;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insert(String labelName, String module) {
        Label labelPo = new Label().selectOne(new EntityWrapper<Label>().eq("label_name", labelName));
        if (labelPo != null) {
            throw new BusinessException(Constants.RESPONSE_CODE_601, Constants.RESPONSE_MESSAGE_601);
        }
        Label label = new Label();
        label.setLabelName(labelName);
        label.setModule(module);
        label.setId(IdGen.uuid());
        boolean result = label.insert();
        if (!result) {
            throw new BusinessException(Constants.RESPONSE_CODE_500, Constants.RESPONSE_MESSAGE_500);
        }
        //保存到redis上
        this.initHotSearchToRedis(labelName, module);
    }

    /**
     * 根据名称模糊查询标签---数据库
     *
     * @param name 标签名称
     * @return 标签库集合
     */
    @Override
    public List<LabelDTO> findListByName(String name) {
        return null;
    }

    /**
     * 初始化标签到redis
     *
     * @param labelName 标签名称
     */
    @Override
    public void initHotSearchToRedis(String labelName, String module) {
        //清除缓存
        redisHandler.getGlobalRedisTemplate().remove(LabelConstants.LABEL_KEY, module);
        //查询出所有的标签
        List<Label> labelList = new Label().selectList(new EntityWrapper<Label>().eq("module", module));
        List<String> stringList = new ArrayList<>();
        for (Label label : labelList) {
            stringList.add(JsonUtil.toJson(label));
        }
        //保存到redis上
        redisHandler.getGlobalRedisTemplate().cacheList(LabelConstants.LABEL_KEY, module, stringList);
    }

    /**
     * 根据名称模糊查询标签----redis
     *
     * @param labelName 标签名称
     * @return 标签集合列表
     */
    @Override
    public List<LabelDTO> getLabelDetailFromRedis(String labelName, String module) {
        //从redis上获取全部标签库
        List<String> list = redisHandler.getGlobalRedisTemplate().getList(LabelConstants.LABEL_KEY, module);
        List<LabelDTO> listLabels = new ArrayList<>();
        if (list.size() > 0) {
            for(String jsonStr : list){
                LabelDTO labelDTO = JsonUtil.fromJson(jsonStr, LabelDTO.class);
                if (StringUtils.isNotEmpty(labelName)) {
                    if (labelDTO.getLabelName().contains(labelName)) {
                        listLabels.add(labelDTO);
                    }
                } else {
                    listLabels.add(labelDTO);
                }
            }
        }
        return listLabels;
    }
}
